package br.com.swp.campestre.entity;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.persistence.Version;

import org.hibernate.validator.Length;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.AutoCreate;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

import br.com.swp.campestre.enumeration.FormaPagamento;
import br.com.swp.campestre.enumeration.SimNao;

@Entity
@Scope(ScopeType.CONVERSATION)
@AutoCreate
@Name("venda")
@SequenceGenerator(sequenceName="Venda_seq" ,  name="Venda_seq" , allocationSize=1)
public class Venda implements Serializable
{

	/**
	 * 
	 */
	private static final long serialVersionUID = -6708693617233322518L;
	
	
	private Long id;
    private Integer version;
    
    
	private Date dataVenda;
	private BigDecimal valorVenda; //soma de todas as formas de pgto (entrada+finanCEF+finanProp)-desconto
	private BigDecimal valorDesconto;
	private String observacao;


	//Campos Pgto de Entrada
	private BigDecimal valorEntrada;
	private FormaPagamento formaPgtoEntrada;
	//Se entrada for um cheque
	private Integer numBancoChqEntrada;
	private Integer numAgenciaChqEntrada;
	private Integer numContaChqEntrada;
	private Integer numChqEntrada;
	//Se cheque entrada for de terceiro
	private SimNao chqEntradaTerceiro;
	private String nomeTerceiroChqEntrada;
	private String cpfTerceiroChqEntrada;

	//Campos Pgto financiamento CEF
	private SimNao finanCEF;
	private BigDecimal valorFinanCEF;
	private Date dataPrimeiraParcelaFinanCEF;
	private Integer numTotalParcelaFinanCEF;
	private BigDecimal valorParcelaFinanCEF;
	private BigDecimal valorSomaParcelaFinanCEF;
	private List<ParcelaFinancimentoCEF>  parcelasFinancimentoCEF;

	//Campos Pgto financiamento Proprio
	private SimNao finanProprio;
	private BigDecimal valorFinanProprio;
	private Integer numTotalParcelaFinanProprio;
	private List<ParcelaFinancimentoProprio> parcelasFinancimentoProprio;

	//comprador PessoaFisica
	private List<ClientePF> clientesPF;
	private List<ClientePJ> clientesPJ;
	
	//Lotes negociados
	private List<Lote> lotes;
	
	


    @Id @GeneratedValue(strategy=GenerationType.SEQUENCE , generator="Venda_seq")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Version
    public Integer getVersion() {
        return version;
    }

    private void setVersion(Integer version) {
        this.version = version;
    }


	public void setParcelasFinancimentoProprio(
			List<ParcelaFinancimentoProprio> parcelasFinancimentoProprio) {
		this.parcelasFinancimentoProprio = parcelasFinancimentoProprio;
	}
	
	@OneToMany(mappedBy="venda")
	public List<ParcelaFinancimentoProprio> getParcelasFinancimentoProprio() {
		return parcelasFinancimentoProprio;
	}


	public void setLotes(List<Lote> lotes) {
		this.lotes = lotes;
	}
	
	@OneToMany(mappedBy="venda")
	public List<Lote> getLotes() {
		return lotes;
	}

	
	public void setDataVenda(Date dataVenda) {
		this.dataVenda = dataVenda;
	}

	@Column(name="data_venda")
	@Temporal(TemporalType.DATE)
	public Date getDataVenda() {
		return dataVenda;
	}

	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	@Length(max=255)
	public String getObservacao() {
		return observacao;
	}


	public void setClientesPF(List<ClientePF> clientesPF) {
		this.clientesPF = clientesPF;
	}
	
    @ManyToMany
    @Column(unique=false)
	public List<ClientePF> getClientesPF() {
		return clientesPF;
	}

    @Column(name="valor_venda")
	public BigDecimal getValorVenda() {
		return valorVenda;
	}

	public void setValorVenda(BigDecimal valorVenda) {
		this.valorVenda = valorVenda;
	}

	@Column(name="valor_desconto")
	public BigDecimal getValorDesconto() {
		return valorDesconto;
	}

	public void setValorDesconto(BigDecimal valorDesconto) {
		this.valorDesconto = valorDesconto;
	}

	@Column(name="valor_entrada")
	public BigDecimal getValorEntrada() {
		return valorEntrada;
	}

	public void setValorEntrada(BigDecimal valorEntrada) {
		this.valorEntrada = valorEntrada;
	}

	@Enumerated(EnumType.STRING)
	@Column(name="forma_pgto_entrada")
	public FormaPagamento getFormaPgtoEntrada() {
		return formaPgtoEntrada;
	}

	public void setFormaPgtoEntrada(FormaPagamento formaPgtoEntrada) {
		this.formaPgtoEntrada = formaPgtoEntrada;
	}

	@Column(name="num_banco_chq_entrada")
	public Integer getNumBancoChqEntrada() {
		return numBancoChqEntrada;
	}

	public void setNumBancoChqEntrada(Integer numBancoChqEntrada) {
		this.numBancoChqEntrada = numBancoChqEntrada;
	}

	@Column(name="num_agencia_chq_entrada")
	public Integer getNumAgenciaChqEntrada() {
		return numAgenciaChqEntrada;
	}

	public void setNumAgenciaChqEntrada(Integer numAgenciaChqEntrada) {
		this.numAgenciaChqEntrada = numAgenciaChqEntrada;
	}

	@Column(name="num_conta_chq_entrada")
	public Integer getNumContaChqEntrada() {
		return numContaChqEntrada;
	}

	public void setNumContaChqEntrada(Integer numContaChqEntrada) {
		this.numContaChqEntrada = numContaChqEntrada;
	}

	@Column(name="num_chq_entrada")
	public Integer getNumChqEntrada() {
		return numChqEntrada;
	}

	public void setNumChqEntrada(Integer numChqEntrada) {
		this.numChqEntrada = numChqEntrada;
	}

	@Enumerated(EnumType.STRING)
	@Column(name="chq_entrada_terceiro")
	public SimNao getChqEntradaTerceiro() {
		return chqEntradaTerceiro;
	}

	public void setChqEntradaTerceiro(SimNao chqEntradaTerceiro) {
		this.chqEntradaTerceiro = chqEntradaTerceiro;
	}

	@Column(name="nome_terceiro_chq_entrada")
	public String getNomeTerceiroChqEntrada() {
		return nomeTerceiroChqEntrada;
	}

	public void setNomeTerceiroChqEntrada(String nomeTerceiroChqEntrada) {
		this.nomeTerceiroChqEntrada = nomeTerceiroChqEntrada;
	}

	@Column(name="cpf_terceiro_chq_entrada")
	public String getCpfTerceiroChqEntrada() {
		return cpfTerceiroChqEntrada;
	}

	public void setCpfTerceiroChqEntrada(String cpfTerceiroChqEntrada) {
		this.cpfTerceiroChqEntrada = cpfTerceiroChqEntrada;
	}

	@Enumerated(EnumType.STRING)
	@Column(name="finan_cef")
	public SimNao getFinanCEF() {
		return finanCEF;
	}

	public void setFinanCEF(SimNao finanCEF) {
		this.finanCEF = finanCEF;
	}

	@Column(name="valor_finan_cef")
	public BigDecimal getValorFinanCEF() {
		return valorFinanCEF;
	}

	public void setValorFinanCEF(BigDecimal valorFinanCEF) {
		this.valorFinanCEF = valorFinanCEF;
	}

	@Temporal(TemporalType.DATE)
	@Column(name="data_primeira_parcela_finan_cef")
	public Date getDataPrimeiraParcelaFinanCEF() {
		return dataPrimeiraParcelaFinanCEF;
	}

	public void setDataPrimeiraParcelaFinanCEF(Date dataPrimeiraParcelaFinanCEF) {
		this.dataPrimeiraParcelaFinanCEF = dataPrimeiraParcelaFinanCEF;
	}

	@Column(name="num_total_parcela_finan_cef")
	public Integer getNumTotalParcelaFinanCEF() {
		return numTotalParcelaFinanCEF;
	}

	public void setNumTotalParcelaFinanCEF(Integer numTotalParcelaFinanCEF) {
		this.numTotalParcelaFinanCEF = numTotalParcelaFinanCEF;
	}

	@Column(name="valor_parcela_finan_cef")
	public BigDecimal getValorParcelaFinanCEF() {
		return valorParcelaFinanCEF;
	}

	public void setValorParcelaFinanCEF(BigDecimal valorParcelaFinanCEF) {
		this.valorParcelaFinanCEF = valorParcelaFinanCEF;
	}

	@Column(name="valor_soma_parcela_finan_cef")
	public BigDecimal getValorSomaParcelaFinanCEF() {
		return valorSomaParcelaFinanCEF;
	}

	public void setValorSomaParcelaFinanCEF(BigDecimal valorSomaParcelaFinanCEF) {
		this.valorSomaParcelaFinanCEF = valorSomaParcelaFinanCEF;
	}

	@OneToMany(mappedBy="venda")
	public List<ParcelaFinancimentoCEF> getParcelasFinancimentoCEF() {
		return parcelasFinancimentoCEF;
	}

	public void setParcelasFinancimentoCEF(
			List<ParcelaFinancimentoCEF> parcelasFinancimentoCEF) {
		this.parcelasFinancimentoCEF = parcelasFinancimentoCEF;
	}

	@Column(name="finan_proprio")
	@Enumerated(EnumType.STRING)
	public SimNao getFinanProprio() {
		return finanProprio;
	}

	public void setFinanProprio(SimNao finanProprio) {
		this.finanProprio = finanProprio;
	}

	@Column(name="valor_finan_proprio")
	public BigDecimal getValorFinanProprio() {
		return valorFinanProprio;
	}

	public void setValorFinanProprio(BigDecimal valorFinanProprio) {
		this.valorFinanProprio = valorFinanProprio;
	}

	@Column(name="num_total_parcela_finan_proprio")
	public Integer getNumTotalParcelaFinanProprio() {
		return numTotalParcelaFinanProprio;
	}

	public void setNumTotalParcelaFinanProprio(Integer numTotalParcelaFinanProprio) {
		this.numTotalParcelaFinanProprio = numTotalParcelaFinanProprio;
	}
	
	@Transient
	public void setComprador(){}
	
	@Transient
	public  String getComprador(){
		
		String comprador = "";
		
		if(clientesPF != null && !clientesPF.isEmpty()){
			ClientePF pf = clientesPF.get(0);
			
			if(pf.getCpf() != null && !"".equals(pf.getCpf())){
				comprador += pf.getCpf();
			}
			
			if(pf.getNome() != null && !"".equals(pf.getNome())){
				
				if( !comprador.trim().equals("") ){
					comprador += " - ";
				}
				comprador += pf.getNome();
			}
			return comprador;
		}
		
		if(clientesPJ != null && !clientesPJ.isEmpty()){
			ClientePJ pj = clientesPJ.get(0);
			
			if(pj.getCnpj() != null && !"".equals(pj.getCnpj())){
				comprador += pj.getCnpj();
			}
			
			if(pj.getNomeFantasia() != null && !"".equals(pj.getNomeFantasia())){
				
				if( !comprador.trim().equals("") ){
					comprador += " - ";
				}
				comprador += pj.getNomeFantasia();
				
			} else if(pj.getRazaoSocial() != null && !"".equals(pj.getRazaoSocial())){
				if( !comprador.trim().equals("") ){
					comprador += " - ";
				}
				comprador += pj.getRazaoSocial();
				
			}
			return comprador;
		}
		
		return comprador;
		
	}

	public void setClientesPJ(List<ClientePJ> clientesPJ) {
		this.clientesPJ = clientesPJ;
	}
    @ManyToMany
    @Column(unique=false)
	public List<ClientePJ> getClientesPJ() {
		return clientesPJ;
	}
    
    @Override
    public boolean equals(Object obj) {
    	
    	if(obj == null) return false;
    	
    	if (obj instanceof Venda) {
			Venda _venda = (Venda) obj;
			
			if ( id == null && _venda.getId() != null){
				return false;
			} else {
				return id.equals(_venda.getId());
			}
			
		} else {
			return false;
		}
    }
    	
    	
    
}
